/*
 * @(#)SystemUtils.java  
 *       
 * 系统名称：    OpenSeats信息系统
 * 版本号：      1.0
 *  
 * Copyright (c)  TravelSky.com
 * All rights reserved.
 * 
 * 作者: 	  Max
 * 创建日期:    2008-10-5
 * 
 * 功能描述：
 * 公用方法描述：
 * 
 * 修改人：
 * 修改日期：
 * 修改原因：
 * 
 */
package com.bjypc.youth.util;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;

import com.bjypc.youth.exception.AppException;

/**
 * 
 * <p>系统工具类<br>
 * <p>
 * @author  Max
 * @since 2008-10-5 下午04:51:10
 */
public final class SystemUtils
{
	/**
	 * 精确到天
	 */
	public static String DATEFORMAT_DAY = "yyyy-MM-dd";

	public static String STRING_DATEFORMAT_DAY = "yyyyMMdd";

	/**
	 * 精确到时分
	 */
	public static String DATEFORMAT_MINUTE = "yyyy-MM-dd HH:mm";

	/**
	 * 精确到秒
	 */
	public static String DATEFORMAT_SECOND = "yyyyMMddHHmmss";

	/**
	 * FOC 日期时间格式
	 */
	public static String FOC_DATEFORMAT_MINUTE = "yyyy-MM-dd HH.mm";

	/**
	 * 航班时间格式
	 */
	public static String HOUR_MIN = "HHmm";

	public static String FOC_TEMP_DATA_DATE_FORMAT = "yyyy-MM-dd HH.mm.ss";

	public static String PSRML_DATE_FORMATE = "ddMMMyy";

	public static String LEG_TIMESTAMP_FORMATE = "yyyy-MM-dd HH:mm:ss";

	/**
	 * 获取当前日期
	 * 
	 * @return yyyyMMdd
	 */
	public static String getStringNow()
	{
		try
		{
			Date date = new Date();
			return new SimpleDateFormat(STRING_DATEFORMAT_DAY).format(date);
		} catch (Exception e)
		{
			return "";
		}
	}

	/**
	 * 获取当前日期
	 * 
	 * @return yyyy-MM-dd
	 */
	public static String getNow()
	{
		try
		{
			Date date = new Date();
			return new SimpleDateFormat(DATEFORMAT_DAY).format(date);
		} catch (Exception e)
		{
			return "";
		}
	}

	/**
	 * 
	 * 获取次日
	 * 
	 * @return yyyy-MM-dd
	 */
	public static String getMorrow()
	{
		try
		{
			Calendar calendar = Calendar.getInstance();
			calendar.add(Calendar.DATE, 1);
			return new SimpleDateFormat(DATEFORMAT_DAY).format(calendar
					.getTime());
		} catch (Exception e)
		{
			return "";
		}
	}

	public static String getBeforeYesterDay()
	{
		try
		{
			Calendar calendar = Calendar.getInstance();
			calendar.add(Calendar.DATE, -2);
			return new SimpleDateFormat(DATEFORMAT_DAY).format(calendar
					.getTime());
		} catch (Exception e)
		{
			return "";
		}
	}

	/**
	 * 获取当前日期时间
	 * 
	 * @return yyyy-MM-dd HH:mm
	 */
	public static String getNowTime()
	{
		try
		{
			Date date = new Date();
			return new SimpleDateFormat(DATEFORMAT_MINUTE).format(date);
		} catch (Exception e)
		{
			return "";
		}

	}

	/**
	 * 获取当前日期时间
	 * 
	 * @return yyyyMMddhhmmss
	 * @author 齐好宗
	 */
	public static String getFilePrefix()
	{
		try
		{
			Date date = new Date();
			return new SimpleDateFormat(DATEFORMAT_SECOND).format(date);
		} catch (Exception e)
		{
			return "";
		}
	}

	/**
	 * 获取当前的FOC时间格式
	 * 
	 * @return yyyy-MM-dd HH.mm
	 */
	public static String getFOCNowTime()
	{
		try
		{
			Date date = new Date();
			return new SimpleDateFormat(FOC_DATEFORMAT_MINUTE).format(date);
		} catch (Exception e)
		{
			return "";
		}
	}

	public static String getDateString(Date date, String formatStr)
	{
		if (date == null)
		{
			return null;
		} else
		{
			SimpleDateFormat des = new SimpleDateFormat(formatStr);
			String result = des.format(date);
			return result;
		}
	}

	/**
	 * 返回月份
	 * 
	 * @param date
	 * @return yyyy-MM
	 * @author 齐好宗
	 */
	public static String getMothString(Date date)
	{
		String result = null;
		if (date == null)
		{
			result = null;
		} else
		{
			SimpleDateFormat des = new SimpleDateFormat("yyyy-MM");
			result = des.format(date);
		}
		return result;
	}

	/**
	 * 由日期类型返回标准的时间字串(yyyy-MM-dd)
	 * 
	 * @param date
	 * @return
	 * @author 齐好宗
	 */
	public static String getDateString(Date date)
	{
		return getDateString(date, DATEFORMAT_DAY);
	}

	/**
	 * 表示两个之间的差值,用毫秒表示
	 * 
	 * @param firstDateTime
	 *            第一个日期时间 yyyy-MM-dd HH.mm
	 * @param secondDateTime
	 *            第二个日期时间 yyyy-MM-dd HH.mm
	 * @return
	 * @throws ParseException
	 */
	public static long compareDateTime(String firstDateTime,
			String secondDateTime) throws ParseException
	{
		// TODO need to furthermore handle the part of code
		// Date date = new Date()
		return format(firstDateTime).getTime()
				- format(secondDateTime).getTime();
	}

	/**
	 * 
	 * 产生日期函数,采用缺省的FOC日期时间格式 yyyy-MM-dd HH:mm
	 * 
	 * @param dateString
	 *            原始串
	 * @return
	 */
	public static Date formatDateTime(String dateString)
	{

		SimpleDateFormat format = new SimpleDateFormat(DATEFORMAT_MINUTE);
		Date dt = null;
		try
		{
			dt = format.parse(dateString);
		} catch (ParseException e)
		{
			e.printStackTrace();
		}
		return dt;

	}

	/**
	 * 
	 * 产生日期函数,采用缺省的FOC日期时间格式 yyyy-MM-dd HH.mm.ss
	 * 
	 * @param dateString
	 *            原始串
	 * @return
	 */
	public static Date format(String dateString)
	{

		SimpleDateFormat format = new SimpleDateFormat(
				FOC_TEMP_DATA_DATE_FORMAT);
		Date dt = null;
		try
		{
			dt = format.parse(dateString);
		} catch (Exception e)
		{
			return null;
		}
		return dt;

	}

	public static Date formatDateHHMM(String dateString)
	{

		SimpleDateFormat format = new SimpleDateFormat(FOC_DATEFORMAT_MINUTE);
		Date dt = null;
		try
		{
			dt = format.parse(dateString);
		} catch (ParseException e)
		{
			e.printStackTrace();
		}
		return dt;

	}

	/**
	 * 
	 * 产生日期函数,采用缺省的FOC日期时间格式 yyyy-MM-dd HH.mm
	 * 
	 * @param dateString
	 *            原始串
	 * @return 时间戳
	 */
	public static Timestamp formatTimestamp(String dateString)
	{
		Date date = formatDateHHMM(dateString);
		if (date != null)
		{
			return new Timestamp(date.getTime());
		} else
		{
			return null;
		}
	}

	/**
	 * 
	 * 产生日期函数,采用缺省的FOC日期时间格式 yyyy-MM-dd HH:mm
	 * 
	 * @param dateString
	 *            原始串
	 * @return 时间戳
	 */
	public static Timestamp formatTimestampDateTime(String dateString)
	{
		Date date = formatDateTime(dateString);
		if (date != null)
		{
			return new Timestamp(date.getTime());
		} else
		{
			return null;
		}
	}

	/**
	 * 获取航节的时间（yyyy-MM-dd HH:mm:ss）
	 * 
	 * @param dateString
	 * @return
	 * @author 齐好宗
	 */
	public static Long formateLegTime(String dateString)
	{
		// long
		Long result = null;
		//
		SimpleDateFormat format = new SimpleDateFormat(FOC_DATEFORMAT_MINUTE);
		Date dt = null;
		if (dateString != null)
		{
			try
			{
				dt = format.parse(dateString);
				result = new Long(dt.getTime());
			} catch (ParseException e)
			{
			}
		}
		return result;
	}

	/**
	 * 
	 * 获取航班显示时间(例:0930)
	 * 
	 * @param dateString
	 *            yyyy-MM-dd HH.mm
	 * @return
	 * @author 齐好宗
	 */
	public static String getFlightTime(String dateString)
	{
		Date date = format(dateString);
		return getFlightTime(date);
	}

	/**
	 * 
	 * 获取航班显示时间(例:0930)
	 * 
	 * @param date
	 *            yyyy-MM-dd HH.mm
	 * @return
	 * @author 齐好宗
	 */
	public static String getFlightTime(Date date)
	{
		String result = "";
		if (date != null)
		{
			SimpleDateFormat des = new SimpleDateFormat(HOUR_MIN);
			result = des.format(date);
		}
		return result;
	}

	/**
	 * 获取航班日期(例:2005-05-16)
	 * 
	 * @param dateString
	 *            yyyy-MM-dd HH.mm
	 * @return
	 * @author 齐好宗
	 */
	public static String getFlightDay(String dateString)
	{
		String result = "";
		Date date = format(dateString);
		if (date != null)
		{
			SimpleDateFormat des = new SimpleDateFormat(DATEFORMAT_DAY);
			result = des.format(date);
		}
		return result;
	}

	/**
	 * 
	 * 产生日期函数,采用日期时间格式 yyyy-MM-dd
	 * 
	 * @param dateString
	 *            原始串
	 * @return 时间戳
	 */
	public static Date formatDate(String dateString)
	{
		SimpleDateFormat format = new SimpleDateFormat(DATEFORMAT_DAY);
		Date dt = null;
		try
		{
			dt = format.parse(dateString);
		} catch (ParseException e)
		{
			dt = null;
		}
		return dt;

	}

	/**
	 * 
	 * @param dateString
	 * @return
	 */
	public static Date formatML(String dateString)
	{
		SimpleDateFormat format = new SimpleDateFormat(PSRML_DATE_FORMATE,
				Locale.US);
		Date dt = null;
		try
		{
			dt = format.parse(dateString);
		} catch (ParseException e)
		{
			e.printStackTrace();
			dt = null;
		}
		return dt;
	}

	public static String getDateString4Transfer(Date date, String formatStr)
	{
		if (date == null)
		{
			return null;
		} else
		{
			SimpleDateFormat des = new SimpleDateFormat(formatStr, Locale.US);
			String result = des.format(date);
			return result;
		}
	}

	/**
	 * 
	 * 产生日期函数
	 * 
	 * @param dateString
	 *            原始串
	 * @param dateFormat
	 *            时间格式
	 * @return 时间戳
	 */
	public static Date formatDate(String dateString, String dateFormat)
	{
		SimpleDateFormat format = new SimpleDateFormat(dateFormat);
		Date dt = null;
		try
		{
			dt = format.parse(dateString);
		} catch (ParseException e)
		{
			// TODO 实现异常处理
			e.printStackTrace();
		}
		return dt;

	}

	/**
	 * 
	 * 产生日期时间函数
	 * 
	 * @param dateString
	 *            原始串
	 * @param dateFormat
	 *            时间格式
	 * @return 时间戳
	 */
	public static Timestamp formatTimestamp(String dateString, String dateFormat)
	{
		SimpleDateFormat format = new SimpleDateFormat(dateFormat);
		Date dt = null;
		try
		{
			dt = format.parse(dateString);
		} catch (ParseException e)
		{
			// TODO 实现异常处理
			e.printStackTrace();
			return null;
		}
		return new Timestamp(dt.getTime());
	}

	public static Date secondFormatDate(String src)
	{
		SimpleDateFormat format = new SimpleDateFormat(
				FOC_TEMP_DATA_DATE_FORMAT);
		Date dt = null;
		try
		{
			if (src != null)
				dt = format.parse(src);
			else
				dt = null;
		} catch (ParseException e)
		{
			// TODO 实现异常处理
			e.printStackTrace();
		}
		return dt;
	}

	/**
	 * 用新串替换旧串
	 * 
	 * @param originstring
	 *            原始串
	 * @param oldstring
	 *            旧串
	 * @param newstring
	 *            新串
	 * @return
	 */
	public static String replace(String originstring, String oldstring,
			String newstring)
	{

		int pos = originstring.indexOf(oldstring);
		while (pos != -1)
		{
			String beforestring = originstring.substring(0, pos);
			String afterstring = originstring.substring(pos
					+ oldstring.length(), originstring.length());
			originstring = beforestring + newstring + afterstring;
			pos = originstring.indexOf(oldstring);
		}
		return originstring;
	}

	public String encrypt(String orginalString)
	{
		return "";
	}

	/**
	 * 
	 * 转换以星期日开始的星期计数为星期一开始的星期计数
	 * 
	 * @param SUN_FST_DAY_OF_WEEK
	 *            ,有效值范围为1-7
	 * @return <li>输入为星期日开始的计数,返回以星期一开始的计数. <li>
	 *         例:原来星期日在DAY_OF_WEEK的计数为7,经此函数返回后为7 <li>返回0为输入参数无效
	 */
	public static int getDayOfWeek(int SUN_FST_DAY_OF_WEEK)
	{
		if (SUN_FST_DAY_OF_WEEK > 7 || SUN_FST_DAY_OF_WEEK < 1)
			return 0;
		if (SUN_FST_DAY_OF_WEEK == 1)
			return 7;
		return SUN_FST_DAY_OF_WEEK - 1;
	}

	/**
	 * 返回Eterm要求的日期
	 * 
	 * @param date
	 * @return
	 * @Author - Xuym <li>返回结果为:日期数字两位月份英文三位年数字两位,如15Aug05
	 */
	public static String toEtermDate(Date date)
	{

		String format = "ddMMMyy";

		DateFormat df = new SimpleDateFormat(format, Locale.ENGLISH);

		String str = df.format(date);

		return str;
	}

	/**
	 * 将字符串组织成数组,按行
	 * 
	 * @param str
	 * @return
	 * @Author - Xuym
	 */
	public static char[][] getCharArray(String str)
	{
		String[] strs = str.split("\n");
		return SystemUtils.getCharArray(strs);
	}

	/**
	 * 将字符串数组组成二维字符数组
	 * 
	 * @param strArray
	 * @return
	 * @Author - Xuym
	 */
	public static char[][] getCharArray(String[] strArray)
	{
		int len = strArray.length;
		char[][] result = new char[len][];

		for (int i = 0; i < len; i++)
		{
			String str = (String) strArray[i];
			result[i] = str.toCharArray();
		}
		return result;
	}

	/**
	 * 将字符串列表转换成二维字符数组
	 * 
	 * @param strList
	 * @return
	 * @Author - Xuym
	 */
	public static char[][] getCharArray(List strList)
	{
		int len = strList.size();
		char[][] result = new char[len][];

		for (int i = 0; i < len; i++)
		{
			String str = (String) strList.get(i);
			result[i] = str.toCharArray();
		}
		return result;
	}

	/**
	 * 
	 * 加和两个整数
	 * 
	 * @param num1
	 *            整数1
	 * @param num2
	 *            整数2
	 * @return 返回两个数的和
	 */
	public static Integer sumInteger(Integer num1, Integer num2)
	{
		int int1 = (num1 != null ? num1.intValue() : 0);
		int int2 = (num2 != null ? num2.intValue() : 0);
		return new Integer(int1 + int2);
	}

	/**
	 * 
	 * 抛出异常
	 * 
	 * @param ex
	 *            原始异常
	 * @param msgKey
	 *            异常Key
	 * @param args
	 *            参数值
	 */
	public static AppException throwException(Throwable ex, String msgKey,
			String[] args)
	{
		AppException appEx = new AppException();
		appEx.setNestedException(ex);
		appEx.setMessageKey(msgKey);
		appEx.setMessageArgs(args);
		return appEx;
	}

	/**
	 * 
	 * 抛出异常
	 * 
	 * @param ex
	 *            原始异常
	 * @param msgKey
	 *            异常Key
	 */
	public static AppException throwException(Throwable ex, String msgKey)
	{
		return throwException(ex, msgKey, null);
	}

	/**
	 * 
	 * 抛出异常
	 * 
	 * @param ex
	 *            原始异常
	 * @param msgKey
	 *            异常Key
	 */
	public static AppException throwException(String msgKey)
	{
		return throwException(null, msgKey, null);
	}

	/**
	 * 
	 * 抛出异常
	 * 
	 * @param ex
	 *            原始异常
	 * @param msgKey
	 *            异常Key
	 */
	public static AppException throwException(String msgKey, String[] args)
	{
		return throwException(null, msgKey, args);
	}

	/**
	 * 
	 * 抛出异常
	 * 
	 * @param ex
	 *            原始异常
	 * @param msgKey
	 *            异常Key
	 */
	public static AppException throwException(Throwable ex)
	{
		return throwException(ex, null, null);
	}

	/**
	 * 
	 * 获取班期，周一到周日分别对应1-7
	 * 
	 * @return
	 */
	public static int getSchedule()
	{
		int day = Calendar.getInstance().get(Calendar.DAY_OF_WEEK) - 1;
		return day == 0 ? 7 : day;

	}

	/**
	 * 
	 * 获取班期，周一到周日分别对应1-7
	 * 
	 * @return
	 */
	public static int getSchedule(Date date)
	{
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		int day = calendar.get(Calendar.DAY_OF_WEEK) - 1;
		return day == 0 ? 7 : day;

	}

	/**
	 * origin为”yyyy-MM-dd HH.mm.ss“格式的原始时间，将其转换为“yyyy-MM-dd HH.mm.ss” 格式的目标时间
	 * 
	 * @return 转换后的字符串
	 */

	public static String exchangeTimeZone(String origin, int offset)
	{
		if (origin == null)
			return null;

		Date date = format(origin);

		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.HOUR_OF_DAY, offset);

		date = cal.getTime();

		SimpleDateFormat formatter = new SimpleDateFormat(
				FOC_TEMP_DATA_DATE_FORMAT);

		String result = formatter.format(date);

		return result;
	}

	/**
	 * 解析TA_STATION表的时区字符串
	 * 
	 * @param zone
	 * @return
	 */
	public static Integer parseZoneStr(String zone)
	{
		if (zone == null)
			return null;

		String prefix = zone.substring(0, 1);

		if (prefix.equals("+"))
			return new Integer(zone.substring(1));
		else
			return new Integer(zone);
	}

	/**
	 * @param flightDate
	 * @param date
	 * @return
	 */
	public static long compareDate(String flightDate, String date)
			throws ParseException
	{
		// DATEFORMAT_DAY
		return (formatDate(flightDate).getTime() - formatDate(date).getTime())
				/ (1000 * 60 * 60 * 24);
	}

	/**
	 * @param tmDate
	 * @param conditionDate
	 * @return
	 */
	public static String getViewTm(String tmDate, String conditionDate)
	{
		String flightTime = "";
		String flightDate = "";
		long diffDay = 0;
		try
		{
			flightTime = SystemUtils.getFlightTime(tmDate);
			flightDate = SystemUtils.getFlightDay(tmDate);
			diffDay = SystemUtils.compareDate(flightDate, conditionDate);
		} catch (Exception e)
		{
			diffDay = 0;
		}
		if (diffDay >= 0)
		{
			for (int i = 0; i < diffDay; i++)
			{
				flightTime += "+";
			}
		} else
		{
			for (int i = 0; i < -diffDay; i++)
			{
				flightTime += "-";
			}
		}
		return flightTime;
	}
	public static Date parseDate(long million){
		Date  date=null;
		GregorianCalendar gregorianCalendar=new GregorianCalendar();
		gregorianCalendar.clear();
		gregorianCalendar.setTimeInMillis(million);
		date=gregorianCalendar.getTime();
		return date;
	}
}
